using System;
using System.Collections.Generic;
using System.Text;
using System.Data.Common;
using System.Data;
using Sinacor.Infra.Service.Data;
using Sinacor.Infra.Service.Security.Authorization;
using Sinacor.Infra.Service.Common;

namespace Sinacor.Servico.Bovespa.Corretagem.ResourceAccess
{

    /// <summary>
    /// Business Logic Faixa
    /// </summary>
    public class Faixa : BaseResourceAccess
    {
        #region Construtor

        /// <summary>
        /// Construtor padrão
        /// </summary>
        public Faixa()
            : base()
        {
        }

        #endregion

        #region ConsultarFaixa
        /// <summary>
        /// Método ConsultarFaixa
        /// </summary>
        public List<BusinessEntity.Faixa> ConsultarFaixa(BusinessEntity.Parameter.ConsultarFaixa consultarfaixa)
        {
            List<BusinessEntity.Faixa> response = null;
            StringBuilder sql = new StringBuilder();

            sql.Append(@"select tbocorr_tab_val.cd_tabela,
							tbocorr_tab_val.nr_seq, 
							tbocorr_tab_val.nr_val_qtde_ini, 
							tbocorr_tab_val.nr_val_qtde_finl,
							tbocorr_tab_val.pc_aliq, 
							tbocorr_tab_val.vl_acresc, 
							tbotipo_aplc_cort.in_base_calc, 
							tbotipo_aplc_cort.desc_tipo_aplc_cort, 
							tbotipo_aplc_cort.cod_tipo_base_calc 
							from 
							tbocorr_tab_val,
							tbocorr_tab_aplc,
							tbotipo_aplc_cort 
							where tbocorr_tab_val.cd_tabela = tbocorr_tab_aplc.cd_tabela
							and tbocorr_tab_val.in_base_calc = tbocorr_tab_aplc.in_base_calc
							and tbocorr_tab_aplc.in_base_calc = tbotipo_aplc_cort.in_base_calc
							and tbocorr_tab_val.cd_tabela = :CD_TABELA");

            using (DbCommand command = this.DataBase.GetSqlStringCommand(sql.ToString()))
            {
                this.DataBase.AddInParameter(command, "CD_TABELA", DbType.Int32, consultarfaixa.CodigoTabelaPadrao);

                response = this.FindAll<BusinessEntity.Faixa>(command, new ConstructEntity<BusinessEntity.Faixa>(ConstrutorConsultarFaixa));
            }

            return response;
        }

        #endregion

        #region ConstrutorConsultarFaixa
        protected BusinessEntity.Faixa ConstrutorConsultarFaixa(IDataReader reader)
        {
            BusinessEntity.Faixa entity = new BusinessEntity.Faixa();

            entity.CodigoTabelaPadrao = reader.GetValue<System.Int32>("cd_tabela");
            entity.Sequencia = reader.GetValue<System.Int32>("nr_seq");
            entity.Aliquota = reader.GetValue<System.Decimal>("pc_aliq");
            entity.Acrescimo = reader.GetValue<System.Decimal>("vl_acresc");
            entity.QuantidadeValorFinal = reader.GetValue<System.Decimal>("nr_val_qtde_finl");
            entity.QuantidadeValorInicial = reader.GetValue<System.Decimal>("nr_val_qtde_ini");
            entity.BaseCalculo.Codigo = reader.GetValue<System.String>("in_base_calc");
            entity.BaseCalculo.Descricao = reader.GetValue<System.String>("desc_tipo_aplc_cort");
            entity.BaseCalculo.TipoBaseCalculo = EnumConverter.Parse<Sinacor.Servico.Bovespa.Corretagem.BusinessEntity.Enum.TipoBaseCalculo>(reader.GetValue<string>("cod_tipo_base_calc"));
                
            return entity;
        }
        #endregion

        #region ExcluirFaixa
        /// <summary>
        /// Método ExcluirFaixa
        /// </summary>
        public void ExcluirFaixa(BusinessEntity.Parameter.ExcluirFaixa excluirfaixa)
        {
            StringBuilder sql = new StringBuilder();

            sql.Append(@"delete from TBOCORR_TAB_VAL
							where cd_tabela = :CD_TABELA
							
							delete from TBOCORR_TAB_APLC
							where cd_tabela = :CD_TABELA");

            using (DbCommand command = this.DataBase.GetSqlStringCommand(sql.ToString()))
            {
                this.DataBase.AddInParameter(command, "CD_TABELA", DbType.Int32, excluirfaixa.CodigoTabelaPadrao);

                this.DataBase.ExecuteNonQuery(command);

            }


        }

        #endregion

        #region SalvarFaixa
        /// <summary>
        /// Método SalvarFaixa
        /// </summary>
        public void SalvarFaixa(BusinessEntity.Faixa faixa)
        {
            StringBuilder sql = new StringBuilder();

            sql.Append(@"insert into TBOCORR_TAB_APLC
							(cd_tabela, in_base_calc)
							values
							(:CD_TABELA, 
							:IN_BASE_CALC)
							");

            using (DbCommand command = this.DataBase.GetSqlStringCommand(sql.ToString()))
            {
                this.DataBase.AddInParameter(command, "CD_TABELA", DbType.Int32, faixa.CodigoTabelaPadrao);
                this.DataBase.AddInParameter(command, "IN_BASE_CALC", DbType.String, faixa.BaseCalculo.Codigo);

                this.DataBase.ExecuteNonQuery(command);

            }


        }


        public void SalvarFaixa(List<BusinessEntity.Faixa> faixa)
        {
            foreach (BusinessEntity.Faixa item in faixa)
            {
                SalvarFaixa(item);
            }
        }


        #endregion


    }
}



